/**
 * 
 */
package com.tomagency.cyberlab.server.rpc;

import java.util.Date;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.tomagency.cyberlab.client.rpc.BelegService;
import com.tomagency.cyberlab.server.config.CyberlabConfigProvider;
import com.tomagency.cyberlab.server.config.FileSystemConfig;
import com.tomagency.cyberlab.server.exports.BubuHandler;
import com.tomagency.cyberlab.server.util.LoggingUtil;

import de.gammadata.business.modelle.BelegDO;
import de.gammadata.communication.modelle.MessageDO;
import de.gammadata.communication.modelle.PostingDO;
import de.gammadata.gwt.modelle.Beleg;
import de.gammadata.gwt.modelle.ResultObject;
import de.gammadata.gwt.modelle.ResultObjectImpl;
import de.gammadata.gwt.modelle.Message.Importance;
import de.gammadata.gwt.modelle.Message.Status;
import de.gammadata.persistence.BelegDAO;
import de.gammadata.persistence.PersistenceManager;

/**
 * @author gfr
 *
 */
@Singleton
public class BelegServlet extends RemoteServiceServlet implements BelegService {

	@Inject private LoggingUtil loggingUtil;
	@Inject private FileSystemConfig fsystem;
	@Inject private CyberlabConfigProvider cyberlabConfigProvider;
	@Inject private BubuHandler bubuHandler;
	@Inject private PersistenceManager persistenceManager;
	@Inject private BelegDAO belegDAO;

	/**
	 * 
	 */
	public BelegServlet() {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public void init(){
		bubuHandler.setCyberlabConfigProvider(cyberlabConfigProvider);
	}


	/**
	 * @see com.tomagency.cyberlab.client.rpc.BelegService#placeBuBuOrder(java.lang.Integer)
	 */
	@Override
	public ResultObject placeBuBuOrder(Integer belegId) {
		ResultObject result = new ResultObjectImpl();
		
		
		EntityManager em = persistenceManager.getEntityManager();		
		BelegDO beleg=null;
		try {
			beleg = getBelegDao().findById(belegId, em);
		} catch (Exception e) {
			loggingUtil.getLogger(this.getClass()).error("placeBuBuOrder() Fehler bei findById()", e);
		}
		if (beleg==null){
			result.setOk(false);
			result.setMessage("Fehler Beleg nicht gefunden ID: "+belegId);
			loggingUtil.getLogger(this.getClass()).error("placeBuBuOrder() Fehler bei findById() ID: "+belegId);
			if (em!=null)
				em.close();
			return result;
		}
		
//		String xml=bubuHandler.genBubuXmlString(beleg, true, beleg.getNummer(), beleg.getNummer());
//		loggingUtil.getLogger(this.getClass()).info("placeBuBuOrder xml erzeugt: \n"+xml);
//		result.setOk(true);
//		result.setMessage("xml-string erzeugt");
		boolean test = cyberlabConfigProvider.getBubuConfig().isTest();
		ResultObject bubuResult = bubuHandler.genBubuXmlOrderFile(beleg, test, beleg.getNummer(), beleg.getNummer());
		result.setOk(bubuResult.isOk());
		result.setMessage(bubuResult.getMessage());
		if (bubuResult.isOk()){
			EntityTransaction tx=null;
			try {
				tx=em.getTransaction();
				tx.begin();
				beleg = getBelegDao().findById(belegId, em);
				beleg.setStatus(Beleg.STATUS_BESTELLT);
				PostingDO posting = new PostingDO();
				posting.setDate(new Date());
				posting.setImportance(Importance.NORMAL);
				posting.setSubject(beleg.getNummer()+ " "+result.getMessage());
				posting.setStatus(Status.NEU);
				posting.setProjekt(beleg.getProject());
				beleg.addMessage(posting);

				beleg=getBelegDao().storeEntity(beleg, em);
				tx.commit();
									
			} catch (Exception e) {
				if (tx!=null)
					tx.rollback();
				loggingUtil.getLogger(this.getClass()).error("placeBuBuOrder() Fehler beim Speichern Beleg Status", e);
				result.setOk(false);
				result.setMessage("order auf ftp-plaziert, aber Fehler beim Speichern Beleg Status: "+e.getMessage());
			}
		}
		em.close();
		
		return result;
	}
	
	@Override
	public ResultObject setBelegStatus(Integer belegId, String status) {
		
			
		ResultObject result = new ResultObjectImpl();
		result.setOk(false);
		result.setMessage("Fehler bei setBelegStatus id:"+belegId+", Status: "+status);
		
		
		EntityManager em = persistenceManager.getEntityManager();		
		BelegDO beleg=null;
		try {
			beleg = getBelegDao().findById(belegId, em);
		} catch (Exception e) {
			loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler bei findById()", e);
		}
		if (beleg==null){
			result.setOk(false);
			result.setMessage("Fehler Beleg nicht gefunden ID: "+belegId);
			loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler bei findById() ID: "+belegId);
			if (em!=null)
				em.close();
			return result;
		}
		
//		String xml=bubuHandler.genBubuXmlString(beleg, true, beleg.getNummer(), beleg.getNummer());
//		loggingUtil.getLogger(this.getClass()).info("placeBuBuOrder xml erzeugt: \n"+xml);
//		result.setOk(true);
//		result.setMessage("xml-string erzeugt");
		
		EntityTransaction tx=null;
		try 
		{
			tx=em.getTransaction();
			tx.begin();
			beleg = getBelegDao().findById(belegId, em);
			beleg.setStatus(status);
			PostingDO posting = new PostingDO();
			posting.setDate(new Date());
			posting.setImportance(Importance.NORMAL);
			posting.setSubject(beleg.getNummer()+ " "+" neuer Status = "+status);
			posting.setStatus(Status.NEU);
			posting.setProjekt(beleg.getProject());
			beleg.addMessage(posting);

			beleg=getBelegDao().storeEntity(beleg, em);
			tx.commit();
			result.setOk(true);
			result.setMessage(beleg.getNummer()+ " "+" neuer Status = "+status);
		
				
		}
		catch (Exception e) {
			if (tx!=null)
				tx.rollback();
			loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler beim Speichern Beleg Status", e);
			result.setOk(false);
			result.setMessage("setBelegStatus() Fehler beim Speichern Beleg Status: "+e.getMessage());
		}
		finally
		{
			if (em!=null&&em.isOpen())
				em.close();
		}
		loggingUtil.getLogger(this.getClass()).info("setBelegStatus() ok: "+result.isOk()+", "+result.getMessage());
		return result;
	}
	
	
	
	private BelegDAO getBelegDao(){
		
		
		if (belegDAO==null){
			belegDAO = new BelegDAO();
		}
		
		return belegDAO;
		
	}



}
